#!/bin/bash

# 日志目录（与start.sh保持一致）
LOG_DIR="/data/app/we-yan-agent/logs"
mkdir -p $LOG_DIR

# 服务配置：端口 服务名称 进程特征（用于精准匹配）
declare -A SERVICES=(
    ["1601"]="genie-client python server.py"
    ["8188"]="genie-tool python server.py"
    ["3000"]="UI pnpm run dev"
    ["8082"]="genie-backend java com.jd.genie.GenieApplication"
)

# 函数：通过端口获取进程PID（精确到监听端口的进程）
get_pid_by_port() {
    local port=$1
    # 优先通过ss命令获取监听端口的主进程PID（排除子进程）
    local pid=$(ss -tulnp | grep -E ":$port\b" | awk '{print $7}' | cut -d',' -f2 | cut -d'=' -f2 | head -n 1)
    echo $pid
}

# 函数：通过进程特征获取所有相关PID（避免遗漏子进程/父进程）
get_pids_by_pattern() {
    local pattern=$1
    # 查找包含特征的所有进程PID（排除grep自身）
    local pids=$(ps -ef | grep -v grep | grep -E "$pattern" | awk '{print $2}')
    echo $pids
}

# 函数：彻底终止服务（包括可能的父进程/子进程）
stop_service() {
    local port=$1
    local name=$2
    local pattern=$3  # 进程特征字符串

    # 1. 先通过端口找主进程
    local main_pid=$(get_pid_by_port $port)
    # 2. 再通过特征找所有关联进程（避免端口占用但PID变化的情况）
    local all_pids=$(get_pids_by_pattern "$pattern")

    # 合并PID列表并去重
    local pids=$(echo -e "$main_pid\n$all_pids" | sort -u | grep -v '^$')

    if [ -z "$pids" ]; then
        echo "$name (port $port) is not running"
        return
    fi

    echo "Stopping $name (port $port, PIDs: $pids)..."

    # 先尝试优雅关闭（SIGTERM）
    kill $pids > /dev/null 2>&1
    local count=0
    local max_wait=15  # 延长等待时间，确保清理完成
    local remaining_pids=""

    # 等待进程终止，记录未终止的PID
    while true; do
        remaining_pids=""
        for pid in $pids; do
            if ps -p $pid > /dev/null 2>&1; then
                remaining_pids="$remaining_pids $pid"
            fi
        done
        if [ -z "$remaining_pids" ]; then
            break  # 所有进程已终止
        fi
        if [ $count -ge $max_wait ]; then
            echo "$name still running (PIDs: $remaining_pids), forcing shutdown..."
            kill -9 $remaining_pids > /dev/null 2>&1
            break
        fi
        sleep 1
        ((count++))
    done

    # 最终确认是否还有残留
    remaining_pids=$(echo "$pids" | xargs -I {} sh -c 'ps -p {} > /dev/null 2>&1 && echo {}')
    if [ -z "$remaining_pids" ]; then
        echo "$name stopped successfully"
    else
        echo "Warning: $name still has remaining processes (PIDs: $remaining_pids)"
    fi
}

# 开始执行服务停止逻辑
echo "🛑 Stopping all services (including possible parent/child processes)..."
for port in "${!SERVICES[@]}"; do
    # 拆分服务名称和进程特征
    info="${SERVICES[$port]}"
    name=$(echo $info | awk '{print $1}')
    pattern=$(echo $info | cut -d' ' -f2-)
    stop_service $port "$name" "$pattern"
done

echo "✅ All stop operations completed. Check if any processes remain with: ps -ef | grep -E 'genie|pnpm|java'"